package org.hamcrest.core; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; import org.hamcrest.Matchers; import org.hamcrest.StringDescription; import org.junit.Assert; import org.junit.Test; public class CombinableTest { private static final CombinableMatcher<Integer> EITHER_3_OR_4 = CombinableMatcher.<Integer>either(equalTo(3)).or(equalTo(4)); private static final CombinableMatcher<Integer> NOT_3_AND_NOT_4 = CombinableMatcher.<Integer>both(not(equalTo(3))).and(not(equalTo(4))); @Test public void bothAcceptsAndRejects() { assertThat(2, NOT_3_AND_NOT_4); assertThat(3, not(NOT_3_AND_NOT_4)); } @Test public void acceptsAndRejectsThreeAnds() { final CombinableMatcher<? super Integer> tripleAnd = NOT_3_AND_NOT_4.and(equalTo(2)); assertThat(2, tripleAnd); assertThat(3, not(tripleAnd)); } @Test public void bothDescribesItself() { assertEquals("(not <3> and not <4>)", NOT_3_AND_NOT_4.toString()); StringDescription mismatch = new StringDescription(); NOT_3_AND_NOT_4.describeMismatch(3, mismatch); assertEquals("was <3>", mismatch.toString()); } @Test public void eitherAcceptsAndRejects() { assertThat(3, EITHER_3_OR_4); assertThat(6, not(EITHER_3_OR_4)); } @Test public void acceptsAndRejectsThreeOrs() { final CombinableMatcher<Integer> orTriple = EITHER_3_OR_4.or(Matchers .greaterThan(10)); assertThat(11, orTriple); assertThat(9, not(orTriple)); } @Test public void eitherDescribesItself() { Assert.assertEquals("(<3> or <4>)", EITHER_3_OR_4.toString()); StringDescription mismatch = new StringDescription(); EITHER_3_OR_4.describeMismatch(6, mismatch); Assert.assertEquals("was <6>", mismatch.toString()); } @Test public void picksUpTypeFromLeftHandSideOfExpression() { assertThat("yellow", CombinableMatcher.both(equalTo("yellow")).and(notNullValue())); } }